#pragma once
#include <thread>
#include <memory>
#include <list>
#include <mutex>
#ifdef _WIN32
#include <winsock2.h>
#include <windows.h>
#include <winsock.h>
#else
#include <unistd.h>
#endif
#include <event2/util.h>
#include "XCom.h"
class XTask;
struct event_base;
class XCOM_API XThread{
public:
    XThread();
    virtual ~XThread();
    // 启动线程
    bool start();
    // 激活线程
    bool activate();
    // 添加任务
    void addTask(XTask* task);
    // 
    void setId(int id){
        m_threadId = id;
    }
    int getId(){
        return m_threadId;
    }
    void exit(){
        is_exit_ = true;
    }
private:
    // 初始化线程
    bool setup();
    // 线程主函数
    void main();
    // 收到通知时触发
    static void notify_cb(evutil_socket_t fd,short flag,void* xthread);
private:
    std::thread m_thread;
    int m_threadId=-1;
    evutil_socket_t notify_send_fd_=-1;
    std::mutex m_mutex;
    std::list<XTask*> m_taskList;
    event_base *m_base;
    bool is_exit_ = false;
};